nodeJs爬取网页数据

您所在的位置:网站首页 nodejs 爬虫 上货 nodeJs爬取网页数据

nodeJs爬取网页数据

2023-11-16 14:05| 来源: 网络整理| 查看: 265

发现node可以爬虫,正好我在找暑期实习,然后就使用node爬一下网站数据找实习。

准备工作 安装node,npm安装依赖包[cheerio, express, eventproxy] http和express模块的使用学习 爬取目标网站 //加载http模块 var http = require('http'); //目标网站,嘿嘿,这个网站有很多实习职位 var pageUrl = 'http://shixi.info/'; http.get(pageUrl, function(res) { var html = ''; res.on('data', function(data) { html += data; }); res.on('end', function() { console.log(html); }); });

http的get请求一个目标网站,回调函数的参数是response,绑定两个事件,一个'data'事件,会不断触发获取数据,数据获取完触发’end‘ 事件。

爬到的的数据就是目标网站的html源代码。

现在html代码有了,我们该怎么解析这个呢?

解析html代码

在这里我们使用cheerio模块,是服务器端的html解析模块,使用方法类型jQuery

var http = require('http'); var cheerio = require('cheerio'); var pageUrl = 'http://shixi.info/'; http.get(pageUrl, function(res) { var html = ''; res.on('data', function(data) { html += data; }); res.on('end', function() { //数据获取完,执行回调函数 callback(html); }); }); function callback(html) { //使用load方法,参数是刚才获取的html源代码数据 var $ = cheerio.load(html); var arrUrl = []; //写法和jQuery一模一样,有没有觉得很cool $('article').each(function(index, element) { var href = $(element).find('.entry-title a').attr('href'); arrUrl.push(href); }); }

这样我们就把目标页面的每条招聘信息的网址存放进了一个数组,当然我们也可以通过对象字面量存一些其他数据,比如招聘信息的title,date等等。

可能有人会问,我只要网址干嘛?嘿嘿,因为JD是在详情页里面,不去爬详情页,我咋看JD。

并发请求

为演示方便:只获取了职位title。

对arrUrl迭代,GET请求。因为是异步操作,所以在这里我们建一个count变量,每次完成一个操作count++,执行done函数,如果count值和arrUrl数组的长度相同,执行函数。

var count = 0; var results = []; function done() { if (count == arrUrl.length) { console.log('done'); } } arrUrl.forEach(function(item, index) { http.get(item, function(res) { var html = ''; res.on('data', function(data) { html += data; }); res.on('end', function() { var $ = cheerio.load(html); var title = $('.entry-title').text(); results[index] = { url: item, title: title }; count++; done(); }); }); }); 使用express模块让数据响应到网页 var express = require('express'); var app = express(); function done() { if (count == arrUrl.length) { //get 方法,第一个参数路径,是一个route的作用。 //回调函数,参数分别是:请求,响应。 //监听8888端口,浏览器打开 http://127.0.0.1:8888 app.get('/', function(req, res) { res.send(JSON.stringify(results)); }).listen('8888', '127.0.0.1'); console.log('done'); } }

浏览器打开 http://127.0.0.1:8888,就能看到我们爬的数据了。

当然我们也可以 对这些数据处理一下,返回到网页的是html内容文本。

使用eventproxy模块控制并发

刚才我们使用的是count变量,有些不够优雅。这里我们引入eventproxy模块。

var eventproxy = require('eventproxy'); //得到实例化对象ep var ep = new eventproxy(); //after,第一个参数是事件名,第二个参数是事件的数量,回调函数的参数是list集合, ep.after('subscribe', arrUrl.length, function(results) { app.get('/', function(req, res) { res.send(JSON.stringify(results)); }).listen('8888', '127.0.0.1'); console.log('done'); }); arrUrl.forEach(function(item, index) { http.get(item, function(res) { var html = ''; res.on('data', function(data) { html += data; }); res.on('end', function() { var $ = cheerio.load(html); var title = $('.entry-title').text(); //通知ep的subscribe事件,ep监测执行完的事件数量等于arrUrl.length,如果等于 执行回到函数。 ep.emit('subscribe', { url: item, title: title }); }); }); 结束

通过nodejs爬虫的学习,学习到了http,express,cheerio,eventproxy的简单使用。更了解到了node异步编程。

《使用 eventproxy 控制并发》

Http模块



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3